package com.kangzhan.controller;

import com.kangzhan.utils.Constants;
import com.kangzhan.utils.FileTypeUtil;
import com.kangzhan.utils.FileUtil;
import org.apache.commons.lang.math.RandomUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;

@Controller
@RequestMapping("file")
public class FileController {
    @RequestMapping("upload")
    public void upload(@RequestParam(value = "files") MultipartFile multipartFile,
                       HttpServletRequest request){
        String errorMsg = "";
        if (multipartFile != null) {
            //OriginalFilename ：获取用户上传的文件名及后缀
            String OriginalFilename = multipartFile.getOriginalFilename();
            //suffix: 获取文件的后缀名
            String suffix = OriginalFilename.substring(OriginalFilename.lastIndexOf(".") + 1);
            //判断文件格式 看自己的业务限制
            if (FileTypeUtil.imageType(suffix)) {
                if (multipartFile.getSize() < Constants.imgSize) {
                    //RootPath: 动态获取文件需要保存的根目录
                    String RootPath =
                            request.getSession().getServletContext().getRealPath(Constants.fileFolder);
                    //fileName: 不能直接用用户上传的文件名，因为会重复，所以使用随机的文件名。
                    // 随机规则为 时间戳+随机数
                    String fileName =
                            System.currentTimeMillis() + "_" + RandomUtils.nextInt(1000000) + "." + suffix;
                    // realPath：全路径
                    // File.separator :  文件路径分隔符。不要再用 // 或  \
                    // 因为windows和linux文件系统不一样，写死的话会有bug,使用这个方式，会自动判别系统
                    String realPath = RootPath + File.separator + fileName;
                    // 核心代码1 : 新建一个空的文件，用户上传的文件到时候就是它
                    File file = new File(realPath);
                    try {
                        // 核心代码2 : 将接口获取的MultipartFile 转换为 正常的 File
                        multipartFile.transferTo(file);
                       String filePath = Constants.fileFolder + File.separator + fileName;
                    } catch (IOException e) {
                        FileUtil.delFile(realPath);
                        throw new RuntimeException(e);
                    }
                } else {
                    errorMsg = "文件过大，请选择小于10M的文件";
                }
            } else {
                errorMsg = "文件类型非法,请选择图片";
            }
        }
    }
}
